package org.research.spring.aop;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.log4j.Logger;
import org.apache.struts2.ServletActionContext;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

/**
 * 日志切面
 */
@Aspect
public class LogAspectJ {
	// 取得日志记录器logger
	public Logger logger = Logger.getLogger(LogAspectJ.class);

	/**
	 * 使用@Pointcut注解定义一个切入点，切入点的名字为anyMethod(), 切入点正则表达式excution(*
	 * test.spring.action.UserAction.*(..))
	 * 的意思是拦截test.spring.action.UserAction类中的所有方法, 不论方法参数有无，也不管反回结果为何类型。
	 */
	@Pointcut("execution(* org.research.struts.action.admin.*.*(..))")
	private void anyMethod() {
	} // 定义切入点的名字


	@Before("anyMethod()")
	public void myBeforeAdvice(JoinPoint joinpoint) {
		// String ip = ServletActionContext.getRequest().getRemoteAddr();
		// String classAndMethod = joinpoint.getTarget().getClass().getName()
		// + "类的" + joinpoint.getSignature().getName();
		// logger.info("前置通知(" + ip + ")：" + classAndMethod + "方法开始执行!");
	}

	@AfterReturning("anyMethod()")
	public void myAfterReturningAdvice(JoinPoint joinpoint) {
		// String classAndMethod = joinpoint.getTarget().getClass().getName()
		// + "类的" + joinpoint.getSignature().getName();
		// logger.info("后置通知：" + classAndMethod + "方法执行正常结束！");
	}

	@AfterThrowing(pointcut = "anyMethod()", throwing = "e")
	public void myAfterThrowingAdvice(JoinPoint joinpoint, Exception e) {
		String classAndMethod = joinpoint.getTarget().getClass().getName()
		+ "类的" + joinpoint.getSignature().getName();
logger.info("异常通知：" + classAndMethod + "方法抛出异常：" + e.getMessage());
	}

	@Around("anyMethod()")
	public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
		// 调用的方法名称;
		String methodName = pjp.getSignature().getName();
		// 获取进入的类名;
		String className = pjp.getSignature().getDeclaringTypeName();
		className = className.substring(className.lastIndexOf(".") + 1).trim();

		// System.out.println("==============进去的方法"+methodName);
		//User admin = (User) ServletActionContext.getRequest().getSession().getAttribute("admin");
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String time = sdf.format(new Date());// 获取当前时间

		// AdminAction控制器日志操作记录
		if (className.equals("Admin_NewAction")) {
			if (methodName.equals("toAddAdmin")) {
				//logger.info("系统用户：" + admin.getAccountNumber() + ",操作添加系统用户,操作时间："+ time);
			}
			if (methodName.equals("updateAdmin")) {
				//logger.info("系统用户：" + admin.getAccountNumber() + ",操作修改系统用户,操作时间："+ time);
			}
			if (methodName.equals("delAdmin")) {
				//logger.info("系统用户：" + admin.getAccountNumber() + ",操作删除系统用户,操作时间："+ time);
			}
		}// newsAction控制器日志操作记录
		else if (className.equals("NewsAction")) {
			if (methodName.equals("editNews")) {
				//logger.info("系统用户：" + admin.getAccountNumber() + ",操作修改新闻,操作时间："+ time);
			} else if (methodName.equals("delNews")) {
				//logger.info("系统用户：" + admin.getAccountNumber() + ",操作删除新闻,操作时间："+ time);
			}
		}

		return pjp.proceed();

	}
}
